【AWS Organizations】SCP更新(update-policy)をメンバーアカウントに委任してみる
Service Control Policy(SCP)は AWS Organizationsの1機能です。 組織のセキュリティ統制、特に予防的ガードレールとして役立ちます。
従来、SCPは管理アカウントでのみ設定できる項目でしたが、 2022年末のアップデートで「メンバーアカウントに委任」できるようになりました。
この委任機能を使って、 SCP更新(update-policy)をメンバーアカウントで実施できるようにしてみます。
本ブログの要旨
- 「SCP更新の委任」はOrganizationsの委任ポリシーにて指定する
- 委任の3パターン
- 全てのSCP更新を許可する … とりあえず全て許可
- 特定SCP更新を許可する(リソースベース) … 対象が固定化できる場合にオススメ
- 特定SCP更新を許可する(タグベース) … 対象が流動的である場合にオススメ
(前提) Organizations委任ポリシーとは
AWS Organizations の一部機能をメンバーアカウントに委任できます。 どのアカウントに、どの機能を委任するのかを 委任ポリシー として 管理アカウント上で設定します。
この機能(委任)は「管理アカウント上のタスクを最小限にする」のに役立ちます。 管理アカウントは権限が強いアカウントであり、SCPによる制御も効かないためです。 管理アカウント上の業務は最小限にするのがベストプラクティスです。
SCP更新の委任パターン
以下 3パターンを紹介します。
- 全てのSCP更新を許可するパターン
- 特定SCP更新を許可するパターン(リソースベース)
- 特定SCP更新を許可するパターン(タグベース)
全てのSCP更新を許可するパターン
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadAndUpdateSCP", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${MemberAccountID}:root" }, "Action": [ "organizations:Describe*", "organizations:List*", "organizations:UpdatePolicy" ], "Resource": "*", "Condition": { "StringEqualsIfExists": { "organizations:PolicyType": "SERVICE_CONTROL_POLICY" }}}]}
${MemberAccountID}
を委任したいメンバーアカウントのアカウントIDに置き換えてください。
この委任ポリシーでできることは以下のとおりです。
- AWSアカウントやOU、ポリシー情報の閲覧
- ※ただしSCP以外のポリシー (バックアップポリシーなど) 情報は見られない
- SCPの更新
全SCPの更新を委任させたい場合には、このパターンでOKです。
特定SCP更新を許可するパターン(リソースベース)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadSCP", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${MemberAccountID}:root" }, "Action": [ "organizations:List*", "organizations:Describe*" ], "Resource": "*", "Condition": { "StringEqualsIfExists": { "organizations:PolicyType": "SERVICE_CONTROL_POLICY" }}}, { "Sid": "UpdateSCP", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${MemberAccountID}:root" }, "Action": [ "organizations:UpdatePolicy" ], "Resource": [ "arn:aws:organizations::${ManagementAccountID}:root/${OrganizationID}/${RootID}", "arn:aws:organizations::${ManagementAccountID}:ou/${OrganizationID}/*", "arn:aws:organizations::${ManagementAccountID}:account/${OrganizationID}/*", "arn:aws:organizations::${ManagementAccountID}:policy/${OrganizationID}/service_control_policy/${PolicyID_A}", "arn:aws:organizations::${ManagementAccountID}:policy/${OrganizationID}/service_control_policy/${PolicyID_B}" ]}]}
以下のとおり置き換えてください。
${MemberAccountID}
: 委任したいメンバーアカウントのアカウントID${ManagementAccountID}
: 管理アカウントのアカウントID${OrganizationID}
: Organizationsの組織ID ( o-xxx )${RootID}
: OrganizationsのルートID ( r-xxx )${PolicyID_A/B}
: SCPのポリシーID ( p-xxx )- 更新を許可したいSCPをここに記載します
更新を許可したいSCPのARNを、Resource句に列挙していきます(コードのハイライト部分)。
画像のように 「Resource句に指定したSCP」は更新できて、 「Resource句に無いSCP」は更新できません。
特定SCP更新を許可するパターン(タグベース)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadSCP", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${MemberAccountID}:root" }, "Action": [ "organizations:List*", "organizations:Describe*" ], "Resource": "*", "Condition": { "StringEqualsIfExists": { "organizations:PolicyType": "SERVICE_CONTROL_POLICY" }}}, { "Sid": "UpdateSCP", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${MemberAccountID}:root" }, "Action": [ "organizations:UpdatePolicy" ], "Resource": "*", "Condition": { "StringEquals": { "organizations:PolicyType": "SERVICE_CONTROL_POLICY", "aws:ResourceTag/Delegate": "True" }}}]}
${MemberAccountID}
を委任したいメンバーアカウントのアカウントIDに置き換えてください。
この委任ポリシーでは Delegate=True
タグが付いたSCPの更新を許可します。タグ付けは事前に管理アカウントにて実施します。
画像のように 「 Delegate=True
タグが付いているSCP」は更新できて、 「 Delegate=True
タグが無いSCP」は更新できません。
おわりに(使い分けについて)
SCP更新の委任ポリシーを3パターンを紹介しました。 以下のように使い分けると良いと思います。
- 全SCP 更新OK → 全てのSCP更新を許可するパターン
- 特定SCPに絞りたい + 対象を固定化できる → 特定SCP更新を許可するパターン(リソースベース)
- 特定SCPに絞りたい + 対象が流動的に変わる → 特定SCP更新を許可するパターン(タグベース)
参考になれば幸いです。